package com.chenjun.designpattern.behavior.state;

/**
 * <p>
 * 状态模式，又称状态对象模式（Pattern of Objects for States），状态模式是对象的行为模式。
 * 
 * <p>
 * 状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。
 * 
 * @author Administrator
 *
 */
public class 状态模式
{
	public static void main(String[] args)
	{
		State stateA = new ConcreteStateA();
		State stateB = new ConcreteStateB();
		
		Context context = new Context();
		
		context.setState(stateA);
		context.request("stateA paramter");
		
		context.setState(stateB);
		context.request("stateB paramter");
	}
}

/**
 * <p>
 * 状态模式所涉及到的角色有：
 * 
 * <p>
 * ● 环境(Context)角色，也成上下文：定义客户端所感兴趣的接口，并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态。
 * 
 * <p>
 * ● 抽象状态(State)角色：定义一个接口，用以封装环境（Context）对象的一个特定的状态所对应的行为。
 * 
 * <p>
 * ● 具体状态(ConcreteState)角色：每一个具体状态类都实现了环境（Context）的一个状态所对应的行为。
 */
class Context
{
	private State state;

	public void setState(State state)
	{
		this.state = state;
	}
	
	 /**
     * 用户感兴趣的接口方法
     */
	public void request(String sampleParameter)
	{
		state.handle(sampleParameter);
	}
}

/**
 * 状态类
 * @author Administrator
 *
 */
interface State
{
	/**
	 * 状态对应的处理方法
	 * @param sampleParameter
	 */
	public void handle(String sampleParameter);
}

class ConcreteStateA implements State
{
	@Override
	public void handle(String sampleParameter)
	{
		System.out.println("ConcreteStateA handle ：" + sampleParameter);
	}
}

class ConcreteStateB implements State
{
	@Override
	public void handle(String sampleParameter)
	{
		System.out.println("ConcreteStateB handle ：" + sampleParameter);
	}
}















